// campus_login_manager.h
#pragma once

#include <memory>
#include <unordered_map>
#include "../login/campus_login_define.h"
#include "nlohmann/json.hpp"
#include "../net/campus_whole_server.h"
#include "../sql/campus_sql_connector.h"
#include "../log/campus_logger.h"

using json = nlohmann::json;

class CampusLoginManager {
public:
    // 构造时注入依赖（服务器、SQL连接）
    CampusLoginManager(CampusWholeServer* whole_server, CampusSqlConnector* sql_connector);
    ~CampusLoginManager();

    // -------------------------- 业务回调接口（供WholeManager转发）--------------------------
    // 处理客户端登录Salt请求
    void handleLoginSalt(websocketpp::connection_hdl hdl, json JMsg);
    // 处理客户端登录校验请求
    void handleLogin(websocketpp::connection_hdl hdl, json JMsg);
    // 处理客户端注册请求
    void handleRegister(websocketpp::connection_hdl hdl, json JMsg);
    // 处理客户端登出请求
    void handleLogout(websocketpp::connection_hdl hdl, json JMsg);
    // 处理客户端连接断开（清理在线状态）
    void handleHdlClose(websocketpp::connection_hdl hdl);

    // -------------------------- SQL结果回调接口（供WholeManager转发）--------------------------
    // SQL查询成功回调
    void onSelectSucess(std::vector<std::vector<std::pair<std::string, std::string>>>& result, CampusSqlInfo* userData);
    // SQL查询失败回调
    void onSelectFail(CampusSqlInfo* userData);
    // SQL插入成功回调
    void onInsertSucess(CampusSqlInfo* userData);
    // SQL插入失败回调
    void onInsertFail(CampusSqlInfo* userData);

    // SQL更新成功回调
    void onUpdateSucess(CampusSqlInfo* userData);
    // SQL更新失败回调
    void onUpdateFail(CampusSqlInfo* userData);

private:
    // -------------------------- 私有业务逻辑（具体登录流程实现）--------------------------
    // 执行“获取登录Salt”流程
    void doLoginSalt(websocketpp::connection_hdl hdl, const std::string& uid);
    // 执行“登录校验”流程
    void doLogin(websocketpp::connection_hdl hdl, const std::string& uid, const std::string& hash);
    // 执行“注册”流程（先查UID是否存在，再插入）
    void doRegister(websocketpp::connection_hdl hdl, const std::string& uid, const std::string& salt, const std::string& hash);
    // 执行“登出”流程（清理在线状态）
    void doLogout(const std::string& uid, websocketpp::connection_hdl hdl);

    // -------------------------- SQL结果处理（业务层解析）--------------------------
    // 处理“查询登录Salt”的SQL结果
    void handleSelectLoginSalt(std::vector<std::vector<std::pair<std::string, std::string>>>& result, std::shared_ptr<CampusLoginInfo> p_info);
    // 处理“登录校验”的SQL结果
    void handleSelectLogin(std::vector<std::vector<std::pair<std::string, std::string>>>& result, std::shared_ptr<CampusLoginInfo> p_info);
    // 处理“注册前检查UID”的SQL结果
    void handleSelectRegisterInfo(std::vector<std::vector<std::pair<std::string, std::string>>>& result, std::shared_ptr<CampusLoginInfo> p_info);
    // 处理“插入注册信息”的SQL结果
    void handleInsertRegisterInfo(std::shared_ptr<CampusLoginInfo> p_info);

    // -------------------------- 辅助方法 --------------------------
    // 打印登录业务数据（调试用）
    void printLoginInfo(const std::shared_ptr<CampusLoginInfo>& p_info);
    // 登录成功后处理（顶号、更新在线状态、发送成功消息）
    void doLoginSucess(websocketpp::connection_hdl hdl, const std::string& uid);
    // 登录失败处理（发送失败消息）
    void doLoginFail(websocketpp::connection_hdl hdl, const std::string& uid);

private:
    CampusWholeServer* whole_server_;                  // 服务器实例（用于发送消息）
    CampusSqlConnector* sql_connector_;// SQL连接实例（用于数据库操作）
    std::unordered_map<std::string, websocketpp::connection_hdl> uid_hdl_map_; // UID-连接句柄映射（管理在线状态）
};